<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>闭包的嵌套和函数的连续调用</title>
</head>

<body>
  <script>
    //   面试题：
    /*
      var obj = {a:1}
      每次调用obj.a ,a属性的值，都会递增1.
      obj.a =>1;
      obj.a =>2;
      obj.a =>3;

      对象中get,set的用法：任何一个对象的属性，都包括一个get（），set()的方法。这两个方法的名字，就是属性的名字。
    */
    //  第一种：
    /*  var obj = {
       _a: 0,
       get a() {
         return (this._a += 1);
       },
       set a(value) {
         this._a = value;
       },
     };
     console.log(obj.a);
     console.log(obj.a);
     console.log(obj.a);
     console.log(obj.a);
     console.log(obj.a); */

    /*
    // 第二种方法：
 
    var obj = {
       _a: 0,
     };
     // 给obj添加一个属性：
     Object.defineProperty(obj, "a", {
       enumerable: true, //说明可以遍历
       configurable: true, // 当且仅当该属性的 configurable 键值为 true 时，该属性的描述符才能够被改变，同时该属性也能从对应的对象上被删除。
       get: function () {
         return this._a += 1;
       },
       set(v) {
         this._a = v;
       }
     })
 
     // console.log(obj); // {_a:0}
 
     // console.log(obj.a);
     obj.a = 10;
     console.log(obj.a);
 
     // configurable: true,时，可以删除属性
     // delete obj.a;
     // console.log(obj.a);  undefined
 
     // console.log(obj.a);
     // console.log(obj.a);
     // console.log(obj.a);
     // console.log(obj.a);
  */

    //  第三种：
    class Person {
      constructor() {
        this._a = 0
      }
      say() {

      }
      set a(v) {
        this._a = v;
      }
      get a() {
        return this._a += 1;
      }
    }

    let obj = new Person();
    console.log(obj.a); // 1
    console.log(obj.a); //2
    console.log(obj.a); //3
    console.log(obj.a);//4
    console.log(obj.a); //5

  </script>
</body>

</html>